﻿using System;
using System.IO;
using System.Data;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Corretagem.Presenter;

namespace Sinacor.UI.Bovespa.Corretagem.View.SmartClient
{
    public partial class TipoDescontoDiferenciado : SinacorWindow, ICadastroTipoDescontoDiferenciado
    {
        /// <summary>
        /// Property com a presenter da view
        /// </summary>
        public Presenter.CadastroTipoDescontoDiferenciado _presenter { get; set; }

        public TipoDescontoDiferenciado()
        {
            this.InitializeComponent();

            this._presenter = new Presenter.CadastroTipoDescontoDiferenciado(this);
            // Configure a presenter no DataContext da janela (para facilitar os bindings)
            this.DataContext = this._presenter;

            // Configurando o Type de novos itens da grid, só necessário quando a grid permitir inclusão
            // Obs: Esta property foi configurada no Code-Behind porque quando configurada no XAML o type
            // não é encontrado.
            this.dtgTipoDescontoDiferenciado.NewItemType = typeof(Model.TipoDescontoDiferenciado);

            this.AfterInitialize += new RoutedEventHandler(Inicializar);
        }

        void Inicializar(object sender, RoutedEventArgs e)
        {
            this.dtgTipoDescontoDiferenciado.EndingInsert += new CancelItemEventHandler(dtgTipoDescontoDiferenciado_EndingInsert);
            this.dtgTipoDescontoDiferenciado.EndingUpdate += new CancelItemEventHandler(dtgTipoDescontoDiferenciado_EndingUpdate);
            this.dtgTipoDescontoDiferenciado.Deleting += new CancelItemsEventHandler(dtgTipoDescontoDiferenciado_Deleting);

            this.dtgTipoDescontoDiferenciado.InsertBegun += new ItemEventHandler(dtgTipoDescontoDiferenciado_InsertBegun);

            this.dtgTipoDescontoDiferenciado.Inserted += new ItemEventHandler(dtgTipoDescontoDiferenciado_Inserted);
            this.dtgTipoDescontoDiferenciado.CancelingInsert += new CancelItemEventHandler(dtgTipoDescontoDiferenciado_CancelingUpdate);
            this.dtgTipoDescontoDiferenciado.CancelingUpdate += new CancelItemEventHandler(dtgTipoDescontoDiferenciado_CancelingUpdate);
            this._presenter.ConsultarTiposDescontosDiferenciados();
        }

        void dtgTipoDescontoDiferenciado_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
        }

        void dtgTipoDescontoDiferenciado_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                int? maxCodigo = this._presenter.ListaTiposDescontosDiferenciados.Max(item => item.Codigo);

                ((Model.TipoDescontoDiferenciado)this.dtgTipoDescontoDiferenciado.EditItem).Codigo = (maxCodigo.HasValue ? maxCodigo + 1 : 1);
            }
        }

        void dtgTipoDescontoDiferenciado_Inserted(object sender, ItemEventArgs e)
        {
            this._presenter.ConsultarTiposDescontosDiferenciados();
        }

        void dtgTipoDescontoDiferenciado_Deleting(object sender, CancelItemsEventArgs e)
        {
            this.ClearServiceErrors();

            if (this.ConfirmarExclusaoTipoDesconto())
            {
                this._presenter.ExcluirTipoDescontoDiferenciado((Model.TipoDescontoDiferenciado)dtgTipoDescontoDiferenciado.SelectedItem);

                if (this.HasErrors)
                    e.Cancel = true;
            }
            else
            {
                e.Cancel = true;
            }
        }

        void dtgTipoDescontoDiferenciado_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.ClearServiceErrors();
                
                this._presenter.AlterarTipoDescontoDiferenciado((Model.TipoDescontoDiferenciado)dtgTipoDescontoDiferenciado.EditItem);

                if (this.HasErrors)
                    e.Cancel = true;
            }
        }

        void dtgTipoDescontoDiferenciado_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.ClearServiceErrors();

                this._presenter.IncluirTipoDescontoDiferenciado((Model.TipoDescontoDiferenciado)dtgTipoDescontoDiferenciado.EditItem);

                if (this.HasErrors)
                    e.Cancel = true;
            }
        }

        #region ICadastroTipoDescontoDiferenciado Members

        // Efetuar um Update Target na grid.
        public void AtualizarListaTiposDescontosDiferenciados()
        {
            dtgTipoDescontoDiferenciado.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
            dtgTipoDescontoDiferenciado.Sort("IdTpDesconto", ListSortDirection.Ascending);
        }

        // Exibe a mensagem da ResourceKey "Bovespa.Corretagem.Message.ConfirmaExclusaoTipoDesconto"
        public bool ConfirmarExclusaoTipoDesconto()
        {
            return SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ConfirmaExclusaoTipoDesconto").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes;
        }

        // Exibe mensagem da ResourceKey "Bovespa.Corretagem.Message.SelecioneTipoDescontoExcluir"
        public void InformarSelecioneTipoDescontoExcluir()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SelecioneTipoDescontoExcluir").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        // Exibe a mensagem da ResourceKey "Bovespa.Corretagem.Message.AlteracaoRealizadaSucesso"
        public void InformarSucessoAlteracao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.AlteracaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        // Exibe a mensagem da ResourceKey "Bovespa.Corretagem.Message.ExclusaoRealizadaSucesso"
        public void InformarSucessoExclusao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ExclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        // Exibe a mensagem da ResourceKey "Bovespa.Corretagem.Message.InclusaoRealizadaSucesso"
        public void InformarSucessoInclusao()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.InclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        #endregion

        
    }
}

